package com.sjms._04_创建_原型模式;

/**
 * 原型模式(Prototype)
 * 实现方式：
 * 需要被克隆的 class类， 重写Object中的clone()方法，并实现Cloneable接口（否则报错 CloneNotSupportedException）
 * 注意：
 * 1.被克隆对象.clone()出的对象，是被克隆对象的当前状态
 * 2.被克隆对象 如果返回的值是 super.clone(); 此时属于浅拷贝
 * <p>
 * 浅拷贝
 * 1)成员变量是，基本数据类型，此时浅拷贝是值传递。其中一个对象的值修改后，不会影响到另一个对象的值。
 * 2)成员变量是，引用数据类型，比如：数组、类的对象。此时浅拷贝是引用传递，也就是只是将该成员变量的引用值（内存地址）复制一份给新的对象。两个对象中的该成员变量执行的是同一个地址，其中一个对象的值修改后，另一个对象的值也会改变。
 */
public class _Test_浅 {

    public static void main(String[] args) throws CloneNotSupportedException {

        //
        Yang_浅 yang = new Yang_浅("001", 1);
        System.out.println("原始羊-姓名：" + yang.name);
        System.out.println("原始羊-地址：" + yang);
        System.out.println();

        //
        Yang_浅 clone_yang = (Yang_浅) yang.clone();
        System.out.println("克隆羊-地址：" + clone_yang);
        System.out.println("克隆羊-姓名：" + clone_yang.name);
        System.out.println();

        //
        System.out.println("修改原始羊姓名为：小明");
        yang.setName("小明");
        System.out.println();

        //
        System.out.println("原始羊-姓名：" + yang.name);
        System.out.println("克隆羊-姓名：" + clone_yang.name);
        System.out.println();

        //
        System.out.println("原始羊-数组内容：" + yang.list);
        System.out.println("克隆羊-数组内容：" + clone_yang.list);
        System.out.println();

        //
        System.out.println("原始羊数组添加内容 MMM ");
        yang.add();
        System.out.println();

        //
        System.out.println("原始羊-数组内容：" + yang.list);
        System.out.println("克隆羊-数组内容：" + clone_yang.list);
        System.out.println();


    }

}
